#include "bsp_beep.h"

#define BSP_BEEP_LOG "[bsp_beep]"

static pin_t g_beep_pin = 0; // BEEP pin

/**
 * @brief  初始化蜂鸣器设备。
 * @param  [in] pin 蜂鸣器设备使用的GPIO引脚， 参考 @ref pin_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_beep_init(pin_t pin)
{
    errcode_t ret;

    // 保存引脚
    g_beep_pin = pin;

    // 设置引脚模式
    if (g_beep_pin == GPIO_04)
    {
        ret = uapi_pin_set_mode(g_beep_pin, PIN_MODE_2);
    }
    else if (g_beep_pin == GPIO_05)
    {
        ret = uapi_pin_set_mode(g_beep_pin, PIN_MODE_4);
    }
    else
    {
        ret = uapi_pin_set_mode(g_beep_pin, PIN_MODE_0);
    }
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set beep pin mode failed, ret = %d\n", BSP_BEEP_LOG, ret);
        return ret;
    }

    // 设置引脚方向
    ret = uapi_gpio_set_dir(g_beep_pin, GPIO_DIRECTION_OUTPUT);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set beep pin direction failed, ret = %d\n", BSP_BEEP_LOG, ret);
        return ret;
    }

    // 设置引脚值
    ret = uapi_gpio_set_val(g_beep_pin, GPIO_LEVEL_LOW);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set beep pin value failed, ret = %d\n", BSP_BEEP_LOG, ret);
        return ret;
    }

    return ERRCODE_SUCC;
}

/**
 * @brief  设置蜂鸣器状态。
 * @param  [in] state 蜂鸣器需要设置的状态， 参考 @ref beep_state_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_beep_set_state(beep_state_t state)
{
    errcode_t ret;

    // 设置引脚电平
    ret = uapi_gpio_set_val(g_beep_pin, state);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set beep pin mode failed, ret = %d\n", BSP_BEEP_LOG, ret);
        return ret;
    }

    return ERRCODE_SUCC;
}

/**
 * @brief  翻转蜂鸣器状态。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_beep_toggle(void)
{
    errcode_t ret;

    // 翻转引脚电平 单个引脚
    ret = uapi_gpio_toggle(g_beep_pin);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set beep pin mode failed, ret = %d\n", BSP_BEEP_LOG, ret);
        return ret;
    }

    return ERRCODE_SUCC;
}
